
/**
 * 
 */
var _classPath = "";

/**
 * 这个是否冲突了...
 */
var _id = "";

/**
 * 字段集合
 */
var _global_data_properties = null;//当前模型的属性列表

/**
 * 表的属性
 */
var _global_class_attributes = null;

/**
 * 是否需要载入richhtml
 */
var _global_need_loadrichhtml = false;
/**
 * 是否需要载入markdown
 */
var _global_need_loadmarkdown = false;

/**
 * 
 */
// const E = window.wangEditor;
var E = null;

/**
 * 
 */
var _config = {
    className: '',
    model: 'add',
    dynamic: false,
    reload: true//执行完成后，是否重新加载父级页面
};

var _map_values = new Map();

//图片集合 一般用于封面图的选择 主要是针对html rich
var _imageList = new Array();

/**
 * 从session中获取的对象信息 用于object的的时候
 */
var _readObject = null;

/**
 * 如果当前表单有outer则，标注最小高度应该大于600，以便承载index.html页面的选择
 */
var _has_outer = false;
/**
 * 
 */
$(window).ready(function () {

    if(typeof pasteform_custom_config != 'undefined'){
        _config = pasteform_custom_config;
    }

    var _path = _apigetquery("path");
    if (_path) {
        _classPath = _path;
        _config.className = _path;
    } else {
        console.error("参数错误，请携带参数path,注意大小写！");
    }
    var uidstr = _apigetquery("id");//基于主表，可能有不一样的类型 int long string guid 等
    if (uidstr != null) {
        _id = (uidstr);
        if (_id != '0') {
            _config.model = 'edit';
        } else {
            _config.model = 'add';
        }
    } else {
        _config.model = 'add';
    }

    if (location.search.indexOf("dynamic=true") >= 0) {
        _config.dynamic = true;
    }

    var _session = _apigetquery("session_key");
    if (_session) {
        var _read = sessionStorage.getItem(_session);
        if (_read) {
            try {
                _readObject = JSON.parse(_read);
            } catch (err) {
                console.log(err);
            }
        }
    }

    var _model = _apigetquery("model");
    if (_model) {
        if (_model == 'select' || _model == 'object') {
            if (parent) {
                if (parent.FuncHiddenSureButtons) {
                    parent.FuncHiddenSureButtons();
                }
            }
        }
        if (_model == "sunobj") {
            $(".newform").css('padding', '10px 10px');
        }
    }

    var _unload = _apigetquery("unload");
    if (_unload) {
        _config.reload = false;
    }

    FuncFilexModel();

});

/**
 * 读取模型和默认值，值等
 */
function FuncFilexModel() {
    if (_id && _id != '0' && _id != 0) {
        _apiget(`${auto_path()}/${_id}/readUpdateModel${location.search}`, true, (c, o) => {
            if (c == 200) {
                loadHeader(o);
                if (o.properties) {
                    _global_data_properties = o.properties;
                    LoadModelProperity(_global_data_properties);
                }
                if (o.title) {
                    this.document.title = "更新" + o.title;
                }
            }
        });
    } else {
        _apiget(`${auto_path()}/readAddModel${location.search}`, true, (c, o) => {
            if (c == 200) {
                loadHeader(o);
                if (o.properties) {
                    //把存储值赋值给对象
                    if (_readObject) {
                        var _dynamicObject = flattenObject(_readObject);
                        o.properties.forEach(ii => {
                            if (!IsArrayProperty(ii.name)) {
                                if (_readObject.hasOwnProperty(ii.name)) {
                                    ii.value = _readObject[ii.name];
                                } else {
                                    if (_dynamicObject.hasOwnProperty(ii.name)) {
                                        ii.value = _dynamicObject[ii.name];
                                    }
                                }
                            }
                        })
                    }
                    _global_data_properties = o.properties;
                    //基于从对象获取值显示到UI
                    LoadModelProperity(_global_data_properties);
                }
                if (o.title) {
                    this.document.title = "新增" + o.title;
                }
            }
        });
    }
}
/**
 * 判断是否是数字的字段
 * @param {*} name 
 * @returns 
 */
function IsArrayProperty(name) {
    if (name) {
        if (name.indexOf("__") > 0) {
            var strs = name.split('__');
            for (const _str in strs) {
                if (isNaN(_str)) {
                    return true;
                }
            }
        }
    }
    return false;
}

/**
 * 把__分割的属性生成为对象
 * @param {*} flatObject 
 * @returns 
 */
function unflattenObject(flatObject) {
    const result = {};
    let isTopLevelArray = true; // 检查最外层是否全是数字键（表示数组）

    // 先检查所有一级键是否都是数字开头（如 "0__xxx"）
    for (const key in flatObject) {
        if (!/^\d+__/.test(key)) {
            isTopLevelArray = false;
            break;
        }
    }

    // 如果是数组，初始化 result 为数组
    if (isTopLevelArray) {
        const maxIndex = Math.max(
            ...Object.keys(flatObject).map(k => parseInt(k.split('__')[0]))
        );
        result = new Array(maxIndex + 1);
    }

    for (const flatKey in flatObject) {
        if (!flatObject.hasOwnProperty(flatKey)) continue;

        const keys = flatKey.split('__');
        let current = result;

        for (let i = 0; i < keys.length; i++) {
            const key = keys[i];
            const isLast = i === keys.length - 1;

            // 如果当前 key 是数字，且当前 current 是数组（或应初始化为数组）
            if (/^\d+$/.test(key)) {
                const index = parseInt(key);

                if (!Array.isArray(current)) {
                    // 如果 current 不是数组，但遇到数字 key，强制转为数组
                    const newArray = [];
                    Object.keys(current).forEach(k => {
                        newArray[k] = current[k];
                    });
                    current = newArray;
                    // 如果是顶层，直接替换 result
                    if (i === 0) result = current;
                }

                if (isLast) {
                    current[index] = flatObject[flatKey];
                } else {
                    if (!current[index]) {
                        current[index] = {};
                    }
                    current = current[index];
                }
            }
            // 普通字符串 key
            else {
                if (isLast) {
                    current[key] = flatObject[flatKey];
                } else {
                    if (!current[key]) {
                        current[key] = {};
                    }
                    current = current[key];
                }
            }
        }
    }

    return result;
}

/**
 * 把对象生成为__分割，这个一般用于赋值
 * @param {*} obj 
 * @param {*} parentKey 
 * @param {*} result 
 * @returns 
 */
function flattenObject(obj, parentKey = '', result = {}) {
    if (Array.isArray(obj)) {
        // 处理数组：生成 0__key, 1__key 等
        obj.forEach((item, index) => {
            const currentKey = parentKey ? `${parentKey}__${index}` : `${index}`;
            if (typeof item === 'object' && item !== null) {
                flattenObject(item, currentKey, result);
            } else {
                result[currentKey] = item;
            }
        });
    } else if (typeof obj === 'object' && obj !== null) {
        // 处理普通对象
        for (const key in obj) {
            if (!obj.hasOwnProperty(key)) continue;
            const currentKey = parentKey ? `${parentKey}__${key}` : key;
            const value = obj[key];
            if (typeof value === 'object' && value !== null) {
                flattenObject(value, currentKey, result);
            } else {
                result[currentKey] = value;
            }
        }
    } else {
        // 直接值（如字符串、数字等）
        if (parentKey) {
            result[parentKey] = obj;
        }
    }
    return result;
}

function isNumber(str) {
    return !isNaN(parseFloat(str)) && isFinite(str);
  }

/**
 * 提交表单 提交表单的数据，最好前面加一层转化啥的
 **/
function funcSubmitForm() {
    //表单验证
    if (!_beforeValidity("#paste-form")) {
        return;
    }
    var _info = $("#paste-form").parseForm();
    //表单验证的补充
    var _result = FuncHandlerParseFormValue(_info);
    if (!_result) {
        return;
    }

    //支持多层级的object info__name转化成info.name=xxx 注意是双下划线符号
    if (_config.dynamic) {
        _info = convertFlattenedToNested(_info);
    }

    if (location.search.indexOf("model=sunobj") > 0) {
        return _info;
    }

    if (location.search.indexOf("model=object") > 0) {
        window.SelectObject = _info;
        layer.msg('读取数据成功，点击下方的确定按钮进行数据返回');

        var _top = window.top;
        if (_top && _top.FuncClickSure) {
            _top.FuncClickSure();
        }
        if (parent && parent.FuncClickSure) {
            parent.FuncClickSure();
        }
        return _info;
    }

    if (_id && _id != '0' && _id != 0) {
        _apipost(`${auto_path()}/updateItem${location.search}`, true, JSON.stringify(_info), function (code, obj) {
            if (code == 200) {
                var _msg = '更新成功';
                if (typeof obj == 'string' && !isNumber(obj)) {
                    _msg = obj;
                }

                layer.msg(_msg, { time: 1500 }, function () {
                    var index = parent.layer.getFrameIndex(window.name); //获取窗口索引
                    parent.layer.close(index);  // 关闭layer  id = layui-layer(index)
                });
            }
        });
    } else {
        _apipost(`${auto_path()}/item${location.search}`, true, JSON.stringify(_info), function (code, obj) {
            if (code == 200) {
                var _msg = '添加成功';
                if (typeof obj == 'string'&& !isNumber(obj)) {
                    _msg = obj;
                }
                layer.msg(_msg, { time: 1500 }, function () {
                    // if (_config.reload) {
                    // window.parent.location.reload();//这个是否搞一个配置！
                    // }
                    var index = parent.layer.getFrameIndex(window.name); //获取窗口索引
                    parent.layer.close(index);  // 关闭layer
                });
            }
        });
    }
}

/**
 * 删除一个组
 * @param {*} gcode 
 */
function handler_group_remove(gcode, event) {
    // $("#group_id_" + gcode).remove();
    $("#group_id_" + gcode).fadeOut(500, function() {
        $(this).remove(); // 动画完成后执行删除
    });
    var _k=-1;
    for(let k=0;k< _ui_data_list.length;k++){
        let _g =_ui_data_list[k];
        if(_g.isgroup){
            if(_g.gcode==gcode){
                _k =k;
                break;
            }
        }
    }
    if(_k>=0){
        _ui_data_list.splice(_k,1);
    }
    event.preventDefault();
    event.stopPropagation();
}

/**
 * 以当前组创建一个新的组
 * @param {*} gcode 
 */
function handler_group_add(gcode, event) {
    var _add_html = $("#group_id_" + gcode).prop('outerHTML');
    // console.log('now group',gcode);

    let g_data_str =null;//string
    for(let _gdata of _ui_data_list){
        if(_gdata.isgroup && _gdata.gcode == gcode){
            g_data_str = JSON.stringify(_gdata);
            break;
        }
    }
    //获取到了后，需要替换关键字符。。。 。。 
    //如何计算出下一个group abx__13 abc__0__bd__2
    if (gcode.indexOf("__") >= 0) {
        var _last = gcode.lastIndexOf("__");
        var _head = gcode.substring(0, _last);
        var _next = parseInt(gcode.substring(_last + 2));
        if (_next != NaN) {
            while (true) {
                _next = _next + 1;
                let _newgroup = _head + "__" + _next;
                if (!_ui_data_list) {
                    break;
                }
                var _hit = false;
                for (var ii of _ui_data_list) {
                    if (ii.gcode) {
                        if (ii.gcode == _newgroup) {
                            _hit = true;
                            break;
                        }
                    }
                }
                if (_hit) {
                    continue;
                }
                break;
            }

            //  console.log('new group '+_head+"__"+_next);
            
            let _new_group_code = `${_head}__${_next}`;
            if(g_data_str!=null){
                let g_data_info = JSON.parse(g_data_str);
                g_data_info.groups=null;
                g_data_info.gcode = _new_group_code;
                _ui_data_list.push(g_data_info);
            }
            // _ui_data_list.push({ gcode: _new_group_code });//写入新的，防止重复
            var _reg = new RegExp(gcode, 'g');
            var _new_html = _add_html.replace(_reg, _new_group_code);
            // $("#group_id_" + gcode).after(_new_html);
            // var $newElement = $(newHtml).hide();
            // $("#targetDiv").after($newElement);
            // $newElement.fadeIn(500);
            // 1. 将HTML字符串转为jQuery对象，并初始隐藏
            var $newElement = $(_new_html).hide(); 
            // 2. 插入到目标元素后面
            $("#group_id_" + gcode).after($newElement); 
            // 3. 执行淡入动画
            $newElement.fadeIn(500); // 时长可调
        }
    }
    // console.log(_add_html);
    event.preventDefault();
    event.stopPropagation();
}
